// 核心：解析src文件夹和src文件夹下的内容，并将resolve.alias配置返回
import fs from 'fs';
import path from 'path';

// 为什么export default函数，而不是直接export default对象？若是对象则无法传入形参options则无法进行配置，使用函数更加灵活
export default (
  options = {
    prefix: '~', // 更多配置就不再给出实现，请前往github查看
  }
) => {
  return {
    name: 'my-vite-aliases',
    enforce: 'pre', // 修改插件执行顺序
    // config是Vite的钩子函数，解析Vite配置前被调用，返回值被深度合并到现有配置中
    config: (config, env) => { // 参数config表示原始配置，参数env表示环境变量
      return {
        resolve: {
          alias: buildResolveAliasConfig(options)
        }
      };
    }
  };
}

const buildResolveAliasConfig = (options) => {
  // 源码可配置src文件夹名称
  const basePath = '../src';
  const prefix = options.prefix;
  
  // 解析src文件夹和src文件夹下的文件夹，并生成相关resolve.alias别名配置(源码读文件为异步，此处简单化实现)
  let resolveAlias = {};
  resolveAlias[prefix] = path.resolve(__dirname, basePath);
  fs.readdirSync(path.resolve(__dirname, basePath)).forEach(dirName => {
    const dirPath = path.resolve(__dirname, basePath, dirName);
    const stat = fs.statSync(dirPath);
    if (stat.isDirectory()) {
      resolveAlias[prefix + dirName] = dirPath;
    }
  });
  
  return resolveAlias;
};